const http = require("http");
const fs = require("fs");
const url = require("url")
const qs = require("querystring");

http.createServer((req,res)=>{
    const pn = url.parse(req.url).pathname;
    if(pn.includes("/api")){
        dataHandle(req,res);
    }else{
        staticHandle(req,res);
    }
}).listen(3000,()=>{
    console.log("服务器开启成功：http://localhost:3000")
})


function dataHandle(req,res){
    // 根据请求方式，接收数据
    if(req.method === "GET"){
        const obj = url.parse(req.url, true).query;
        programHandle(req, res, obj);
    }else{
        let str = "";
        req.on("data",(d)=>{
            str += d;
        })
        req.on("end",()=>{
            const obj = qs.parse(str);
            programHandle(req, res, obj)
        })
    }
}

function programHandle(req, res, data){
    // 根据数据中携带的功能类型，执行不同的功能路由
    switch(data.type){
        case "select":
            select(req,res,data);
            break;
        case "insert":
            insert(req,res,data);
            break;
        case "update":
            update(req,res,data);
            break;
        case "remove":
            remove(req,res,data);
    }
}

function remove(req,res,data){
    // console.log(data);
    // 1. 先读
    fs.readFile("./database/stu.json", "utf-8", (err, msg)=>{
        if(err){
            const obj = {};
            obj.code = 2;
            obj.title = "修改数据之前的读取失败";
            obj.data = [];
            res.write(JSON.stringify(obj));
            res.end();
        }else{
            // 2. 解析读取到的数据
            const msg1 = JSON.parse(msg);
            const msg2 = JSON.parse(msg);

            // 3. 对读取到并解析的数据进行修改
            // 查找到要修改的数据
            let i = 0;
            msg2.some((val,idx)=>{
                i = idx;
                return val.id === data.id;
            })
            // 对查询到的要修改的数据进行修改
            // console.log(msg2[i]);
            console.log(msg2)
            msg2.splice(i,1);

            // 4. 再将修改之后的数据，存回去
            fs.writeFile("./database/stu.json", JSON.stringify(msg2), err=>{
                const obj = {};
                if(err){
                    obj.code = 0;
                    obj.title = "修改数据失败";
                    obj.data = msg1;
                }else{
                    obj.code = 1;
                    obj.title = "修改数据成功";
                    obj.data = msg2;
                }
                res.write(JSON.stringify(obj));
                res.end();
            })
        }
    })
}

// 修改数据功能
function update(req,res,data){
    // 1. 先读
    fs.readFile("./database/stu.json", "utf-8", (err, msg)=>{
        if(err){
            const obj = {};
            obj.code = 2;
            obj.title = "修改数据之前的读取失败";
            obj.data = [];
            res.write(JSON.stringify(obj));
            res.end();
        }else{
            // 2. 解析读取到的数据
            const msg1 = JSON.parse(msg);
            const msg2 = JSON.parse(msg);

            // 3. 对读取到并解析的数据进行修改
            // 查找到要修改的数据
            let i = 0;
            msg2.some((val,idx)=>{
                i = idx;
                return val.id === data.id;
            })
            // 对查询到的要修改的数据进行修改
            msg2[i].stuName = data.stuName;
            msg2[i].tel = data.tel;
            msg2[i].result = data.result;

            // 4. 再将修改之后的数据，存回去
            fs.writeFile("./database/stu.json", JSON.stringify(msg2), err=>{
                const obj = {};
                if(err){
                    obj.code = 0;
                    obj.title = "修改数据失败";
                    obj.data = msg1;
                }else{
                    obj.code = 1;
                    obj.title = "修改数据成功";
                    obj.data = msg2;
                }

                res.write(JSON.stringify(obj));
                res.end();
            })
        }
    })
}


// 添加数据功能
function insert(req,res,data){
    // 1. 先读
    fs.readFile("./database/stu.json", "utf-8", (err, msg)=>{
        if(err){
            const obj = {};
            obj.code = 2;
            obj.title = "插入数据之前的读取失败";
            obj.data = [];
            res.write(JSON.stringify(obj));
            res.end();
        }else{
            // 2. 解析读取到的数据
            const msg1 = JSON.parse(msg);
            const msg2 = JSON.parse(msg);

            // 3. 对读取到并解析的数据进行增加
            msg2.push({
                stuName:data.stuName,
                tel:data.tel,
                result:data.result,
                id: Date.now() + (Math.random() + "").slice(2)
            })

            // 4. 再将增加之后的数据，存回去
            fs.writeFile("./database/stu.json", JSON.stringify(msg2), err=>{
                const obj = {};
                if(err){
                    obj.code = 0;
                    obj.title = "插入数据失败";
                    obj.data = msg1;
                }else{
                    obj.code = 1;
                    obj.title = "插入数据成功";
                    obj.data = msg2;
                }

                res.write(JSON.stringify(obj));
                res.end();
            })
        }
    })
}

// 查询数据功能
function select(req,res,data){
    // 读取json文件
    fs.readFile("./database/stu.json", "utf-8", (err, data)=>{
        // 解析读取到的数据
        data = JSON.parse(data);
        // 根据读取结果，决定向前端返回的数据内容
        const obj = {};
        if(err || data.length<1){
            obj.code = 0;
            obj.title = "没有读取到数据";
            obj.data = [];
        }else{
            obj.code = 1;
            obj.title = "读取数据成功";
            obj.data = data;
        }
        // 返回给前端
        res.write(JSON.stringify(obj));
        // 结束
        res.end();
    })
}

function staticHandle(req,res){
    const pn = url.parse(req.url).pathname;
    fs.readFile("./www" + pn, (err,data)=>{
        if(err){
            res.write("not found");
        }else{
            res.write(data);
        }
        res.end();
    })
}


// listen(参数1，参数2，参数3)
// MAC：
//     参数1：端口
//     参数2：地址
// win：
//     参数1：地址
//     参数2：端口

